package com.uncp.comisiondeadmision.evaluacion.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import com.uncp.comisiondeadmision.comprobantedepago.beans.PostulanteBean;
import com.uncp.comisiondeadmision.evaluacion.beans.DetalleSolicitudBean;
import com.uncp.comisiondeadmision.evaluacion.beans.DetalleSolicitudBeanMixto;
import com.uncp.comisiondeadmision.evaluacion.beans.RequisitoBean;
import com.uncp.comisiondeadmision.evaluacion.beans.SolicitudBean;
import com.uncp.comisiondeadmision.util.MySqlDBConn;

public class MySqlSolicitudInscripcionDAO implements SolicitudInscripcionDAO {

	@Override
	public int insertaDetalleSolicitud(DetalleSolicitudBean bean)
			throws Exception {

		Connection conn = null;
		PreparedStatement pstm = null;

		try {
			String sql = "insert into detallesolicitud values(null,?,?,?,?,?)";
			conn = new MySqlDBConn().getConnection();
			pstm = conn.prepareStatement(sql);
				
			pstm.setBytes(1, bean.getBlbImagen());
			pstm.setString(2, bean.getStrObservacion());
			pstm.setString(3, bean.getStrEstado());
			pstm.setInt(4, bean.getIntNroSolicitud());
			pstm.setInt(5, bean.getIntCodRequisito());

			return pstm.executeUpdate();

		} catch (Exception e) {
			System.out.println(e);
		} finally {
			try {
				if (pstm != null)
					pstm.close();
			} catch (SQLException e1) {
			}
			try {
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
			}
		}
		return -1;
	}
	
	
	
	
	
	
	
	
	
////que me liste todos los requisitos desprobados y desaprobados
	@Override
	public ArrayList<RequisitoBean> traeRequisitos(int intCodPostulante)
			throws SQLException {

		Connection conn = null;
		PreparedStatement pstm1 = null;
		PreparedStatement pstm2 = null;

		ArrayList<RequisitoBean> lista = new ArrayList<RequisitoBean>();

		try {
			
		/*corregi tu select XD estaba mal
		 * "select distinct r.codrequisito,r.nombre "
					+ "from requisito r inner join detallesolicitud d "
					+ "on r.codrequisito = d.codrequisito inner join solicitud s "
					+ "on d.nrosolicitud = s.nrosolicitud "
					+ "where r.codrequisito "
					+ "NOT IN (SELECT d.codrequisito FROM solicitud s "
					+ "inner join detallesolicitud d "
					+ "on s.nrosolicitud = d.nrosolicitud "
					+ "where s.codpostulante = ?)";
		 * 
		 * 
		 * */
			
			
			String sql1 ="SELECT distinct r.codrequisito,r.nombre FROM requisitoxmodalidad rm inner join requisito" +
					" r on rm.codrequisito=r.codrequisito inner join postulante p on p.codtipomodalidad=rm.codtipomodalidad " +
					"where p.codpostulante="+intCodPostulante+" and NOT exists (select d.codrequisito from solicitud s inner join detallesolicitud d " +
					"on s.nrosolicitud=d.nrosolicitud where d.codrequisito = r.codrequisito and s.codpostulante="+intCodPostulante+")"; 
			
			String sql2="select distinct r.codrequisito,r.nombre,d.estado,d.observacion from requisito r inner join detallesolicitud d " +
					"on r.codrequisito = d.codrequisito inner join solicitud s on d.nrosolicitud = s.nrosolicitud " +
					"where d.estado='desaprobado' and s.codpostulante = "+intCodPostulante;
			

			conn = new MySqlDBConn().getConnection();
			pstm1 = conn.prepareStatement(sql1);
			
			pstm2 = conn.prepareStatement(sql2);
			
			ResultSet rs1 = pstm1.executeQuery();
			ResultSet rs2= pstm2.executeQuery();

			RequisitoBean bean = null;

			while (rs1.next()) {
				bean = new RequisitoBean();
				bean.setIntCodRequisito(rs1.getInt(1));
				bean.setStrNombreRequisito(rs1.getString(2));
				bean.setStrEstadoRequisito("null");
				lista.add(bean);
			}
			
			while (rs2.next()) {
				bean = new RequisitoBean();
				bean.setIntCodRequisito(rs2.getInt(1));
				bean.setStrNombreRequisito(rs2.getString(2));
				bean.setStrEstadoRequisito(rs2.getString(3));
				bean.setStrObservacion(rs2.getString(4));
				lista.add(bean);
			}
			
			
			
			
		} catch (Exception e) {
			System.out.println(e);
		} finally {
			try {
				if (pstm1 != null && pstm2!=null)
					pstm1.close();
				pstm2.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}

		}
		return lista;

	}

	@Override
	public SolicitudBean verificaSolicitud(String strCodPostulante)
			throws Exception {
		// select * from solicitud where codpostulante=5;

		return null;
	}

	@Override
	public Integer aprobarRequisito(Integer intItem) throws Exception {
		Connection con = null;
		PreparedStatement ps = null;

		try {
			con = new MySqlDBConn().getConnection();
			String sql = "update detallesolicitud set estado='aprobado' where item=?";
			ps = con.prepareStatement(sql);
			ps.setInt(1, intItem);

			System.out.println("SE actualizo el requisito :" + ps);

			return ps.executeUpdate();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			try {
				if (con != null)
					con.close();
				if (ps != null)
					ps.close();
			} catch (Exception e2) {
				System.out.println(e2.getMessage());
			}

		}

		return -1;
	}

	@Override
	public DetalleSolicitudBean buscaDetalle(Integer intItem) throws Exception {
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {

			con = new MySqlDBConn().getConnection();
			String sql = "select d.item,d.imagen "
					+ "from  detallesolicitud d  inner join requisito r "
					+ "on r.codrequisito = d.codrequisito where d.item=?";

			ps = con.prepareStatement(sql);
			DetalleSolicitudBean bean = new DetalleSolicitudBean();
			ps.setInt(1, intItem);

			System.out.println("Busca Detalle  :" + ps);

			rs = ps.executeQuery();
			while (rs.next()) {

				bean.setIntItem(rs.getInt(1));
				bean.setBlbImagen(rs.getBytes(2));

			}
			return bean;
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			try {
				if (con != null)
					con.close();
				if (ps != null)
					ps.close();
			} catch (Exception e2) {
				System.out.println(e2.getMessage());
			}

		}

		return null;
	}

	@Override
	public ArrayList<DetalleSolicitudBeanMixto> traeDetallePendiente(
			Integer cod_postu) throws Exception {
		Connection con = null;
		PreparedStatement ps = null;
		ArrayList<DetalleSolicitudBeanMixto> lista;
		ResultSet rs = null;
		try {
			lista = new ArrayList<DetalleSolicitudBeanMixto>();
			con = new MySqlDBConn().getConnection();
			String sql = "select d.item,r.nombre,s.nrosolicitud from  detallesolicitud d  inner join requisito r "
					+ "on r.codrequisito = d.codrequisito inner join solicitud s "
					+ "on d.nrosolicitud = s.nrosolicitud where s.codpostulante=? "
					+ "and d.estado='pendiente'";
			ps = con.prepareStatement(sql);
			DetalleSolicitudBeanMixto bean;
			ps.setInt(1, cod_postu);

			System.out.println("Busca Detalle Pendiente :" + ps);

			rs = ps.executeQuery();
			while (rs.next()) {
				bean = new DetalleSolicitudBeanMixto();
				bean.setIntItem(rs.getInt(1));
				bean.setStrNombre(rs.getString(2));
				bean.setIntNroSolicitud(rs.getInt(3));
				lista.add(bean);
			}
			return lista;
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			try {
				if (con != null)
					con.close();
				if (ps != null)
					ps.close();
			} catch (Exception e2) {
				System.out.println(e2.getMessage());
			}

		}

		return null;
	}

	@Override
	public Integer desaprobarRequisito(Integer intItem) throws SQLException {
		Connection con = null;
		PreparedStatement ps = null;

		try {
			con = new MySqlDBConn().getConnection();
			String sql = "update detallesolicitud set estado='desaprobado' where item=?";
			ps = con.prepareStatement(sql);
			ps.setInt(1, intItem);

			System.out.println("SE actualizo el requisito :" + ps);

			return ps.executeUpdate();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			try {
				if (con != null)
					con.close();
				if (ps != null)
					ps.close();
			} catch (Exception e2) {
				System.out.println(e2.getMessage());
			}

		}

		return -1;
	}

	@Override
	public int actualizaSolicitud(PostulanteBean bean)
			throws Exception {

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

		Connection conn = null;
		PreparedStatement pstm = null;
		int ultimaSoliInsertada = -1;

		try {
			String sql = "update solicitud set fecha=?,estado=? where codpostulante=? and fecha is null and estado is null";
			conn = new MySqlDBConn().getConnection();
			pstm = conn.prepareStatement(sql);
			pstm.setString(1, sdf.format(new Date()) + "");
			pstm.setString(2, "pendiente");
			pstm.setInt(3, bean.getIntCodPostulante());

			ultimaSoliInsertada = pstm.executeUpdate();

			// Esta linea obtiene el ultimo codigo insertado
			ResultSet resulset = pstm.getGeneratedKeys();

			if (resulset.next()) {
				ultimaSoliInsertada = resulset.getInt(1);
			} else {
				System.out.println("No Obtuvo el ultimo codigo");
			}

		} catch (Exception e) {
			System.out.println(e);
		} finally {
			try {
				if (pstm != null)
					pstm.close();
			} catch (SQLException e1) {
			}
			try {
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
			}
		}
		return ultimaSoliInsertada;

	}

	@Override
	public ArrayList<SolicitudBean> traeSolicitud() throws SQLException {
		Connection conn = null;
		PreparedStatement pstm = null;

		ArrayList<SolicitudBean> lista = new ArrayList<SolicitudBean>();

		try {
			String sql = "select * from solicitud";

			conn = new MySqlDBConn().getConnection();
			pstm = conn.prepareStatement(sql);

			ResultSet rs = pstm.executeQuery();

			SolicitudBean bean = null;

			while (rs.next()) {
				bean = new SolicitudBean();
				bean.setIntNroSolicitud(rs.getInt(1));
				bean.setStrFechaReg(rs.getString(2));
				bean.setStrEstado(rs.getString(3));
				bean.setIntCodPostulante(rs.getInt(4));
				lista.add(bean);
			}
		} catch (Exception e) {
			System.out.println(e);
		} finally {
			try {
				if (pstm != null)
					pstm.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}

		}
		return lista;

	}

	@Override
	public int aprobarSolicitud(Integer nroSolicitud) throws SQLException {
		Connection con = null;
		PreparedStatement ps = null;

		try {
			con = new MySqlDBConn().getConnection();
			String sql = "update solicitud set estado='aprobado' where nroSolicitud=?";
			ps = con.prepareStatement(sql);
			ps.setInt(1, nroSolicitud);

			System.out.println("SE actualizo La Solicitud :" + ps);

			return ps.executeUpdate();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			try {
				if (con != null)
					con.close();
				if (ps != null)
					ps.close();
			} catch (Exception e2) {
				System.out.println(e2.getMessage());
			}

		}

		return -1;
	}
	
	@Override
	public ArrayList<PostulanteBean> consultaPendienteDesaprobado() throws SQLException {

		Connection con = null;
		Statement s = null;
		ResultSet rs = null;
		String pendiente = "pendiente";
		
		ArrayList<PostulanteBean> array = new ArrayList<PostulanteBean>();

		try {
			con = new MySqlDBConn().getConnection();
			s = con.createStatement();
			String sql = " select p.codpostulante,p.nombres,p.apepat,p.apemat,p.estado,s.estado "
					+ "  from postulante p join solicitud s "
					+ " on p.CODPOSTULANTE = s.CODPOSTULANTE "
					+ "  where p.ESTADO = '"
					+ pendiente
					+ "' and  s.ESTADO = '" + pendiente + "' or s.estado = 'desaprobado'";
			rs = s.executeQuery(sql);

			System.out.println("lista cliente :" + sql);
			PostulanteBean bean;

			while (rs.next()) {

				bean = new PostulanteBean();
				bean.setIntCodPostulante(rs.getInt(1));
				bean.setStrNombres(rs.getString(2));
				bean.setStrApepat(rs.getString(3));
				bean.setStrApemat(rs.getString(4));
				bean.setStrEstado(rs.getString(5));
				bean.setStrEstadoRequisito(rs.getString(6));
				array.add(bean);

			}

		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			try {
				if (con != null)
					con.close();
				if (s != null)
					s.close();
				if (rs != null)
					rs.close();
			} catch (Exception e2) {
				System.out.println(e2.getMessage());
			}
		}

		return array;
	}
	
	@Override
	public int apruebaSolicitud(int nroSolicitud)
			throws SQLException {
		
		Connection conn = null;
		//CallableStatement se necesita para store procedure y function
		CallableStatement cs = null;
		
		int conformidad=-1;
		try {
			String sql = "{? = call apruebaSolicitud(?)}";
			conn = new MySqlDBConn().getConnection();
			//igual que un prepared Statemen --- prepareCall
			cs = conn.prepareCall(sql);
			
			
			//el valor de retorno es considerado como un parametro de salida
			cs.registerOutParameter(1,Types.INTEGER);
			
			cs.setInt(2,nroSolicitud);
			
			//pongo el execute tambien hay execute update y execute query
			cs.execute();
			conformidad=cs.getInt(1);
			
		} catch(SQLException e) {
			e.printStackTrace();
		} finally {
			conn.close();
			cs.close();
		}
		return conformidad;
	}
	
	
	

}
